package role_v1

import (
	"context"
	"errors"
	"fmt"
	"gf-xb-api/internal/dao"
	"gf-xb-api/internal/model/dto"
	"gf-xb-api/internal/model/entity"
	"gf-xb-api/utility/xpermission"
	"gf-xb-api/utility/xstr"
	"strconv"
)

func (s *sRole) Create(ctx context.Context, in dto.CreateRoleInput) (err error) {

	// 根据parentId来找到该父级已有的角色
	cols := dao.SysRole.Columns()

	var pid uint
	if in.ParentId == nil {
		pid = 0
	} else {
		pid = *in.ParentId
	}

	var pr *entity.SysRole

	if pid != 0 {
		// pid=0表示根节点
		err = dao.SysRole.Ctx(ctx).WherePri(pid).Scan(&pr)
		if err != nil {
			return err
		}

		if pr == nil {
			return errors.New("保存失败：父级角色不存在")
		}
	}

	var rl *entity.SysRole
	err = dao.SysRole.Ctx(ctx).Where(cols.ParentId, pid).Where(cols.Name, in.Name).Scan(&rl)
	if err != nil {
		return err
	}

	if rl != nil {
		return errors.New("保存失败：当前角色已存在")
	}

	var lcr *entity.SysRole // 父级ID下最新的角色信息
	err = dao.SysRole.Ctx(ctx).Where(cols.ParentId, pid).Unscoped().OrderDesc(cols.Sort).Scan(&lcr)
	if err != nil {
		return err
	}
	var code string
	var sort uint

	if lcr == nil {
		// 该父级ID下最新的角色信息不存在，则表示是第一个
		if pr != nil {
			code = fmt.Sprintf("%s%s", pr.Code, "00001")
		} else {
			code = "00001"
		}

		sort = 1
	} else {
		// 该父级ID下最新的角色信息存在，则在此基础上加1
		sort = lcr.Sort + 1
		if pr != nil {
			code = fmt.Sprintf("%s%s", pr.Code, xstr.PadLeft(strconv.Itoa(int(sort)), 5, '0'))
		} else {
			code = xstr.PadLeft(strconv.Itoa(int(lcr.Sort)+1), 5, '0')
		}
	}

	// 新角色
	userUUID := xpermission.GetLoginUserUUID(ctx)
	nr := &entity.SysRole{
		Name:      in.Name,
		Code:      code,
		ParentId:  pid,
		Sort:      sort,
		Remark:    in.Remark,
		CreatedBy: &userUUID,
		UpdatedBy: &userUUID,
	}

	_, err = dao.SysRole.Ctx(ctx).Insert(nr)
	if err != nil {
		return err
	}

	return err
}
